home *** CD-ROM | disk | FTP | other *** search
- // Gmail Manager
- // By Todd Long <longfocus@gmail.com>
- // http://www.longfocus.com/firefox/gmanager/
-
- const GM_CC = Components.classes;
- const GM_CI = Components.interfaces;
-
- function gmCookies()
- {
- this._console = GM_CC['@mozilla.org/consoleservice;1'].getService(GM_CI.nsIConsoleService);
- this._observer = GM_CC["@mozilla.org/observer-service;1"].getService(GM_CI.nsIObserverService);
- this._sessions = new Array();
- }
-
- gmCookies.prototype = {
- loadSession: function(aHost)
- {
- if (this._sessions[aHost] == null)
- {
- this._sessions[aHost] = new Object();
-
- this._sessions[aHost].count = 1;
- this._sessions[aHost].cookies = this._getCookies(aHost);
-
- // Load observers
- this._observer.addObserver(this, "http-on-modify-request", false);
- this._observer.addObserver(this, "http-on-examine-response", false);
- }
- else
- this._sessions[aHost].count++;
- },
-
- restoreSession: function(aHost)
- {
- if (this._sessions[aHost] != null)
- {
- this._sessions[aHost].count--;
-
- if (this._sessions[aHost].count == 0)
- {
- // Restores cookies
- this._putCookies(aHost);
-
- // Reset data
- this._sessions[aHost] = null;
-
- // Remove observers
- this._observer.removeObserver(this, "http-on-modify-request");
- this._observer.removeObserver(this, "http-on-examine-response");
- }
- }
- },
-
- _getCookies: function(aHost)
- {
- var iioServ = GM_CC["@mozilla.org/network/io-service;1"].getService(GM_CI.nsIIOService);
- var cookieManEnum = GM_CC["@mozilla.org/cookiemanager;1"].getService(GM_CI.nsICookieManager).enumerator;
- var cookies = new Array();
-
- while (cookieManEnum.hasMoreElements())
- {
- // Use nsICookie2 to access isSession and rawHost
- var nextCookie = cookieManEnum.getNext().QueryInterface(GM_CI.nsICookie2);
-
- if (nextCookie.host.indexOf(aHost) > -1)
- {
- var uri = iioServ.newURI("http://" + nextCookie.rawHost, "UTF-8", null);
- var name = nextCookie.name + "=" + nextCookie.value + ";";
- var type = (nextCookie.isDomain ? "Domain=" : "Host=") + nextCookie.host + ";";
- var path = "Path=" + nextCookie.path + ";";
- var expires = "";
-
- if (!nextCookie.isSession)
- expires = "Expires=" + new Date(nextCookie.expires * 1000).toGMTString() + ";";
-
- cookies[name] = new Object();
- cookies[name].cookie = name + type + path + expires;
- cookies[name].uri = uri;
- }
- }
-
- /*
- var cookieServ = GM_CC["@mozilla.org/cookieService;1"].getService(GM_CI.nsICookieService);
- var uri = iioServ.newURI("http://.google.com", null, null);
- //this._console.logStringMessage(nextCookie.rawHost + " *** " + nextCookie.host);
- this._console.logStringMessage(cookieServ.getCookieString(uri, null));
- */
-
- return cookies;
- },
-
- _putCookies: function(aHost)
- {
- var cookieServ = GM_CC["@mozilla.org/cookieService;1"].getService(GM_CI.nsICookieService);
- var cookieMan = GM_CC["@mozilla.org/cookiemanager;1"].getService(GM_CI.nsICookieManager);
- var cookieManEnum = cookieMan.enumerator;
-
- // Clear current host cookies
- while (cookieManEnum.hasMoreElements())
- {
- var nextCookie = cookieManEnum.getNext().QueryInterface(GM_CI.nsICookie2);
-
- if (nextCookie.host.indexOf(aHost) > -1)
- cookieMan.remove(nextCookie.host, nextCookie.name, nextCookie.path, false);
- }
-
- // Restore host cookies
- for (var cookieName in this._sessions[aHost].cookies)
- {
- var cookie = this._sessions[aHost].cookies[cookieName].cookie;
- var uri = this._sessions[aHost].cookies[cookieName].uri;
-
- cookieServ.setCookieString(uri, null, cookie, null);
- }
- },
-
- observe: function(aSubject, aTopic, aData)
- {
- var httpChannel = aSubject.QueryInterface(GM_CI.nsIHttpChannel);
- var uri = httpChannel.URI;
- var host = null;
-
- // Find matching host
- for (var lookupHost in this._sessions)
- if (uri.host.indexOf(lookupHost) > -1)
- host = lookupHost;
-
- var isGood = (uri.originCharset.indexOf("gmanager") == -1 && host != null);
-
- if (aTopic == "http-on-modify-request" && isGood)
- {
- try {
- httpChannel.setRequestHeader("Cookie", "", false);
-
- for (var cookieName in this._sessions[host].cookies)
- {
- var cookie = this._sessions[host].cookies[cookieName].cookie;
- var cookieValue = (cookie.split(";"))[0];
- var cookieHost = this._sessions[host].cookies[cookieName].uri.host;
-
- if (cookie.indexOf("Domain") > -1)
- cookieHost = cookie.match(/\Domain=[a-zA-Z.]*;/).slice(7, -1);
- else if (cookie.indexOf("Host") > -1)
- cookieHost = cookie.match(/\Host=[a-zA-Z.]*;/).slice(5, -1);
-
- if (uri.host.indexOf(cookieHost) > -1 && cookieValue.indexOf("GV=") == -1)
- httpChannel.setRequestHeader("Cookie", cookieValue + ";", true);
- }
- } catch(e) {}
- }
- else if (aTopic == "http-on-examine-response" && isGood)
- {
- try {
- var cookies = httpChannel.getResponseHeader("Set-Cookie").split("\n");
-
- for (var i = 0; i < cookies.length; i++)
- {
- var cookieName = (cookies[i].split("="))[0];
- this._sessions[host].cookies[cookieName] = new Object();
- this._sessions[host].cookies[cookieName].cookie = cookies[i];
- this._sessions[host].cookies[cookieName].uri = uri;
- }
- } catch(e) {}
- }
- },
-
- QueryInterface: function(iid)
- {
- if (!iid.equals(GM_CI.gmICookies) &&
- !iid.equals(GM_CI.nsISupports))
- throw Components.results.NS_ERROR_NO_INTERFACE;
- return this;
- }
- }
-
- var myModule = {
- firstTime: true,
-
- myCID: Components.ID("{81516840-f7dd-11da-974d-0800200c9a66}"),
- myDesc: "Service for cookies",
- myProgID: "@longfocus.com/gmanager/cookies;1",
- myFactory: {
- createInstance: function (outer, iid) {
- if (outer != null)
- throw Components.results.NS_ERROR_NO_AGGREGATION;
-
- return (new gmCookies()).QueryInterface(iid);
- }
- },
-
- registerSelf: function (compMgr, fileSpec, location, type)
- {
- if (this.firstTime) {
- this.firstTime = false;
- throw Components.results.NS_ERROR_FACTORY_REGISTER_AGAIN;
- }
-
- compMgr = compMgr.QueryInterface(Components.interfaces.nsIComponentRegistrar);
- compMgr.registerFactoryLocation(this.myCID, this.myDesc, this.myProgID, fileSpec, location, type);
- },
-
- getClassObject: function (compMgr, cid, iid)
- {
- if (!cid.equals(this.myCID))
- throw Components.results.NS_ERROR_NO_INTERFACE;
-
- if (!iid.equals(Components.interfaces.nsIFactory))
- throw Components.results.NS_ERROR_NOT_IMPLEMENTED;
-
- return this.myFactory;
- },
-
- canUnload: function(compMgr) { return true; }
- };
-
- function NSGetModule(compMgr, fileSpec) { return myModule; }